package com.dean.netty.client;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;

import java.util.HashMap;
import java.util.Map;


public class DeanNettyClientInit extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline pipeline = socketChannel.pipeline();
        /**
         * LengthFieldBasedFrameDecoder用于解析带固定长度的数据报。
         * TCP发送的数据规则：可以将数据进行拆分或合并，因此对端接收到的数据报可能不是初始发送时的格式；
         * 一般的做法是在包头设置length长度，指明数据包的长度，再由接受方根据length拼接或剪裁收到的数据，从而形成完整的数据包
         */
        pipeline.addLast("LengthFieldBasedFrameDecoder",new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,8,0,8));
        // 将上条语句的length加入传递的数据中心
        pipeline.addLast("LengthFieldPrepender",new LengthFieldPrepender(8));
        // 传递字符串的编码解码器
        pipeline.addLast("StringDecoder",new StringDecoder(CharsetUtil.UTF_8));
        pipeline.addLast("StringEecoder",new StringEncoder(CharsetUtil.UTF_8));
        // 增加自定义处理器MyNettyServerHandler，用于实际处理请求，并给出响应
        pipeline.addLast("DeanNettyHandler",new DeanNettyClientHandler());

    }
}
